package structureDonnee;

import java.util.LinkedList;

import math.Fraction;

import verificateur.EnsembleVariable;

public class Inequalite {
	//inegalite = "expr>=0" ou "expr<=0" ou "expr>0" ou "expr<0" 
	//ineqalite est transforme a la forme "expr>=0" ou "expr>0"
	//il a un champ expression pour expr
	//un champ strict pour distinguer >= ou >
	Expression expr;
	boolean strict; //ture si ( > ou <), false si ( >= ou <=)
	
	public Inequalite(){expr = new Expression();strict = false;}
	public Inequalite(Expression ex){
		expr = new Expression(ex.listExpr);
		strict = false; // >= par defaut
	}
	public Inequalite(Inequalite ine){
		expr = new Expression(ine.expr);
		strict = ine.strict;
	}
	public Inequalite(Expression ex, boolean b){
		expr = new Expression(ex.listExpr);
		strict = b;
	}
	
	//construire inequalite depuis un String sous condition de connaitre EnsembleVariable ev
	public Inequalite(String s, EnsembleVariable ev){//String: "expr>=0" ou "expr<=0" ou "expr>0" ou "expr<0"
		String ms = s;
		int i=0;
		int carLu=s.charAt(i);

		StringBuffer buffer = new StringBuffer();
		do{
			buffer.append((char)carLu);
			i++;
			carLu = s.charAt(i);
		}while("><=".indexOf(carLu)==-1);
		
		//distingur > ou >=
		i++;
		int sss = s.charAt(i);
		if("=".indexOf(sss)==0) strict = false;
		else strict = true;
		
		ms = buffer.toString();
		if(carLu=='>') expr = new Expression(ms,ev);
		if(carLu=='<'){	//si inferieur, on change des signes de chaque coefficient.
			Expression tmp = new Expression(ms,ev);
			for(int j =0;j<tmp.listExpr.size();j++)
				tmp.listExpr.set(j, tmp.listExpr.get(j).times(-1));
			expr = tmp;
		}
	}
	
	//renvoyer le NOT logique de inequalite. e.x. ( i>=0 ).not() = ( i<0 ), 
	public Inequalite not(){
		LinkedList<Fraction> tmp = new LinkedList<Fraction>();
		for (int i = 0; i<expr.listExpr.size();i++){
			tmp.add(i, expr.listExpr.get(i).negative());
		}
		Inequalite not =  new Inequalite(new Expression(tmp));
		not.strict = !this.strict;
		return not;
	}
	
	public Expression getExpr(){return expr;}
	public boolean getStrict(){return strict;}
	
	//pour afficher une Inequalite
	public void pulish(EnsembleVariable ev){
		System.out.print("INE:");
		expr.publish(ev);
		if(strict) System.out.print(">0,");
		else System.out.print(">=0,");
	}
}
